/**
 * FileName: PasswordEncoder
 * Author: Mr.Wang
 * Date: 2025/10/15 13:50
 * Description:
 * History:
 */
package org.test.device.utils.salt;

import org.mindrot.jbcrypt.BCrypt;

/**
 * 〈一句话功能简述〉<br>
 * 〈密码编码器接口〉
 *
 * @author Mr.Wang
 * @create 2025/10/15
 * @since 1.0.0
 */
public class PasswordEncoder {

    private static final String SALT="device";

    /**
     * 对明文密码进行加密
     * @param rawPassword 原始明文密码
     * @return 加密后的密码字符串（包含自动生成的盐值）
     */
    public static String encode(String rawPassword) {
        if (rawPassword == null) {
            throw new IllegalArgumentException("明文密码不能为空");
        }
        // gensalt(10)：生成盐值，参数10是工作因子（4-31之间）
        // 工作因子越大，加密耗时越长，安全性越高（推荐10-12）
        return BCrypt.hashpw(rawPassword, BCrypt.gensalt(10));
    }

    /**
     * 验证密码是否匹配
     * @param rawPassword 用户输入的明文密码
     * @param encodedPassword 数据库中存储的加密密码（包含盐值）
     * @return true：密码匹配；false：密码不匹配
     */
    public static boolean matches(String rawPassword, String encodedPassword) {
        if (rawPassword == null || encodedPassword == null) {
            return false; // 任何一方为空均视为不匹配
        }
        // BCrypt 会自动从加密字符串中提取盐值进行验证
        return BCrypt.checkpw(rawPassword, encodedPassword);
    }

    // 测试示例
    public static void main(String[] args) {
        // 1. 模拟用户注册：加密密码并存储到数据库
        String rawPassword = "User@123456"; // 用户设置的明文密码
        String encodedPassword = encode(rawPassword);
        System.out.println("BCrypt加密后的密码（含自动盐值）：" + encodedPassword);
        // 输出示例（每次加密结果不同，因为盐值随机）：
        // $2a$10$L8eR8WlT2Q4ZJZJZJZJZJO5eX5eX5eX5eX5eX5eX5eX5eX5eX5e

        // 2. 模拟用户登录：验证输入密码是否正确
        String inputPassword = "User@123456"; // 用户登录时输入的密码
        boolean isMatch = matches(inputPassword, encodedPassword);
        System.out.println("正确密码验证结果：" + isMatch); // 输出 true

        // 3. 验证错误密码
        String wrongPassword = "Wrong@123";
        boolean isWrongMatch = matches(wrongPassword, encodedPassword);
        System.out.println("错误密码验证结果：" + isWrongMatch); // 输出 false
    }
}